访问修饰符 public & private
在 C#中,访问修饰符指定了类成员(属性、方法、字段等)的可见性和访问级别。C#中有四种访问修饰符:public、private、protected 和 internal。
public 修饰符
public 是一种最常用的访问修饰符,用于指定成员是公共的,可以在任何地方访问。也就是说,public 成员可以从该成员所在的类的任何位置,以及该类的对象的任何位置进行访问。
public class MyClass
{
public int myPublicInt;
}
在这个示例中,我们定义了一个公共类 MyClass,并在该类中定义了一个公共整型变量 myPublicInt。这意味着 myPublicInt 可以在该类的任何位置进行访问,也可以通过该类的对象在其他地方进行访问。
private 修饰符
private 是一种访问修饰符,用于限制只有在当前类中才能访问该成员,其他类或子类均无法访问该成员。具体来说,被 private 修饰的成员只能在声明该成员的类内部使用。
public class MyClass
{
private int count; // private 成员
public void IncrementCount()
{
count++; // 可以在类内部访问 private 成员
}
public void PrintCount()
{
Console.WriteLine(count); // 可以在类内部访问 private 成员
}
}
public class MyOtherClass
{
public void DoSomething()
{
MyClass myClass = new MyClass();
// 以下代码会报错,因为 MyOtherClass 无法访问 MyClass 中的 private 成员
Console.WriteLine(myClass.count);
}
}
在上面的代码中,MyClass 类中的 count 字段被 private 修饰,因此只能在该类内部使用。MyOtherClass 类无法访问 count 字段,因为它不是 MyClass 类。
使用 private 修饰符可以隐藏类的内部实现细节,从而提高代码的安全性和可维护性。通常情况下,我们会将类的字段都设置为 private,并提供公共的方法来访问和修改这些字段。这种做法可以防止其他类直接修改类的内部字段,从而保护类的数据和状态的完整性。
总结
- public 修饰符指定成员是公共的,可以在任何地方访问。
- private 修饰符指定成员是私有的,只能在该成员所在的类的内部访问。
- 选择使用哪个访问修饰符,应该根据类的设计目的和功能需求来决定。通常情况下,应该尽量将成员的可见性降低到最低限度,以避免不必要的访问和潜在的错误。
protected 修饰符
protected修饰符用于限制只有在当前类及其子类中才能访问该成员。- 这意味着在同一程序集中的其他类无法访问被
protected修饰的成员。
public class Animal
{
protected string name; // protected 成员
public void SetName(string name)
{
this.name = name;
}
}
public class Cat : Animal
{
public void PrintName()
{
Console.WriteLine(name); // 在子类中可以访问父类的 protected 成员
}
}
public class Dog
{
public void PrintName()
{
Animal animal = new Animal();
// 下面这行代码会报错,因为 Dog 类不能访问 Animal 类中的 protected 成员
Console.WriteLine(animal.name);
}
}
Animal类中的name字段被protected修饰,因此只有Animal类及其子类中才能访问它。Cat类继承自Animal类,因此可以访问name字段。- 而
Dog类不能访问name字段,因为它不是Animal类或其子类。
internal 修饰符
-
internal修饰符用于限制只有在同一程序集中的其他类才能访问该成员。 -
这意味着在当前程序集外的其他程序集中无法访问被
internal修饰的成员。
// 在同一程序集中的两个类
public class MyClass
{
internal string name; // internal 成员
public void PrintName()
{
Console.WriteLine(name);
}
}
public class MyOtherClass
{
public void DoSomething()
{
MyClass myClass = new MyClass();
// 在同一程序集中的类可以访问 internal 成员
Console.WriteLine(myClass.name);
}
}
// 在另一个程序集中的类
public class MyExternalClass
{
public void DoSomething()
{
MyClass myClass = new MyClass();
// 以下代码会报错,因为 MyExternalClass 不在同一程序集中,无法访问 internal 成员
Console.WriteLine(myClass.name);
}
}
MyClass类中的name字段被internal修饰,因此只有在同一程序集中的其他类才能访问它。MyOtherClass类在同一程序集中,因此可以访问name字段。- 而
MyExternalClass类不在同一程序集中,因此不能访问name字段。